%Syntax:        Recognition.m; se llama a la funcion

%Escribir en el prompt de MATLAB Recognition.m (verificar el path del archivo y
%y los archivos auxiliares). Evaluar el sistema de reconocimiento de voz

clear all;
close all;
ncoeff = 20;          %Número Requerido de coeficientes mfcc
N = 5;               %Número de palabras en el vocabulario.
k = 3;                %Number of nearest neighbors to choose
fs=16000;             %Frecuencia de Muestreo 
duration1 = 0.15;     %Periodo de silencio inicial en segundos
duration2 = 2;        %Duración de la grabación
G=2;                  %Variar este factor para compensar las variaciones de amplitud
NSpeakers = 2;        %Número de personas que hablan.

fprintf('Presionar cualquier tecla para comenzar %g segundos de grabación de voz...', duration2); 
pause;
silence = wavrecord(duration1*fs, fs);
fprintf('Grabando ahora...'); 
speechIn = wavrecord(duration2*fs, fs);         % duration*fs el número total de puntos de muestras 
fprintf('Grabación finalizada.\n');
fprintf('Reconociendo comando...\n');
speechIn1 = [silence;speechIn];                  %rellena con 150 ms de silencio
speechIn2 = speechIn1.*G;
speechIn3 = speechIn2 - mean(speechIn2);         %Eliminacion DC offset 
speechIn = noisereduction(speechIn3,fs);         %Aplica sustraccion espectral
rMatrix1 = mfccf(ncoeff,speechIn,fs);            %feature vector
rMatrix = CMN(rMatrix1);                         %Remueve convolutional noise

Sco = DTWScores(rMatrix,N);                      %calcula los puntajes DTW 
[SortedScores,EIndex] = sort(Sco);               %ordena de forma ascendente
K_Vector = EIndex(1:k);                          %Toma los k puntajes mas bajos
Neighbors = zeros(1,k);                          %dejara los k-N vecinos

%Essentially, code below uses the index of the returned k lowest scores to
%determine their classes

for t = 1:k
    u = K_Vector(t);
    for r = 1:NSpeakers-1
        if u <= (N)
            break
        else u = u - (N);
        end
    end
    Neighbors(t) = u;
    
end

%Aplica la regla del vecino k-Nearest 

Nbr = Neighbors;

%sortk = sort(Nbr);
[Modal,Freq] = mode(Nbr);                              %valor mas frecuente
Word = strvcat('a','e','i','o','u','Izquierda','Derecha','Subir','Bajar','Avanzar','Retroceder','Alto'); 
if mean(abs(speechIn)) < 0.01
    fprintf('No microphone connected or you have not said anything.\n');
elseif ((k/Freq) > 2)                                  %if no majority
    fprintf('La palabra no pudo ser reconocida apropiadamente.\n');
else
    fprintf('La palabra dicha fue %s.\n',Word(Modal,:)); %Prints recognized word
end

